#include <stdio.h>
/*
 * 二.关键字
 *  关键字就是c语言已经定义好的名字，直接可以拿来使用,不需要再次定义。
 *      2.1 数据类型相关的关键字
 *          用于定义变量或者类型
 *              定义变量的语法结构:
 *                  类型 变量名;
 *                  扩展:变量名属于标识符,标识符(变量名,函数)有命名规则
 *              标识符的命名规则:
 *                  标识符只能以数字,字母和下划线命名
 *                  首字母不能是数字
 *                  不能与关键字相同
 *          char，short,int,long,float,double,
 *          struct,union,enum,signed,unsigned,void
 *
 *  1.char字符型,用char定义的变量是字符型变量,占1个字节
 *          有符号: -2^7 ~ 2^7-1
 *          无符号: 0~2^8-1
 *  2.short短整型,使用short定义的变量是短整型变量,占2个字节
 *          有符号:-2^15 ~ 2^15-1
 *          无符号:0~2^16-1
 *  3.int整型,用int定义的变量是整型变量,在32位以上的系统下占4个字节
 *          有符号:-2^31 ~ 2^31-1
 *          无符号:0 ~ 2^32-1
 *  4.long长整型 用long定义的变量是长整型的,在32位系统下占4个字节,在64位系统下占8个字节
 *  5.float单浮点型(实数),用float定义的变量是单浮点型的实数,占4个字节。
 *  6.double双浮点型(实数),用double定义的变量是双浮点型的实数,占8个字节。由2个4字节组成的
 *  7.struct 这个关键字是与结构体类型相关的关键字,可以用它来定义结构体类型,以后讲结构体的时候再将。
 *  8.union这个关键字是与共用体(联合体)相关的关键字,以后再讲。
 *  9.enum与枚举类相关的关键字。
 *  10.signed有符号(正负)的意思,
 *      在定义char,整型(short,int,long)数据的时候用signed修饰,代表咱们定义的数据是有符号类型的数据。
 *      只能保存正数,也可以保存负数。
 *     列: signed int a = 10;
 *          signed int b = -6;
 *      注意:默认情况下signed可以省略,即int a = -10;//默认a就是符号类型的数据
 *
 *  11.unsigned无符号的意思
 *      在定义char,整型(short,int,long)数据的时候用unsigned修饰,代表咱们定义的数据是无符号类型的数据。
 *      只能保存正数和0
 *
 *  12. void 空类型的关键字
 *      char,int,float都可以定义变量
 *      void 不能定义变量,没有void类型的变量
 *      void 是用来修饰函数的参数或者没有返回值,代表函数没有参数或没有返回值。
 *
 *
 *  13. 存储相关关键字
 *      register, static, const, auto, extern
 *
 *      寄存器简介
 *          寄存器是中央处理器内的组成部分,寄存器是有限存储容量的高速存储部件,它们可用来暂存指令,
 *          数据和地址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC).
 *          在中央处理器的算术及逻辑部件中,存器有累加器(ACC).
 *
 *
 *      1.register 是寄存器的意思,用register修饰的变量是寄存器变量,
 *          即:在编译的时候告诉编译器这个变量是寄存器变量,尽量将其存储空间分配在寄存器中。
 *          注意:
 *          (1) 定义的变量不一定真的放在寄存器中。
 *          (2) cpu取数据的时候去寄存器中拿数据比去内存中拿数据要快。
 *          (3) 因为寄存器比较宝贵,所以不能定义寄存器数组。
 *          (4) register只能修饰 字符型及整型,不能修饰浮点型。
 *          (5) 因为register修饰的变量可能存放在寄存器中不存放在内存中,所以不能对
 *              寄存器变量取地址,因为只有存放在内存中的数据才有地址。
 *
 *      2.static是静态的意思
 *          static可以修饰全局变量,局部变量,函数。
 *          使用static修饰的变量,此变量保存在内存的静态区空间中。
 *
 *      3.const
 *          const是常量的意思。
 *          用const修饰的变量是只读的,不能修改它的值。
 *          const int a = 101;//在定义a的时候用const修饰,并赋初值为101
 *          从此以后,就不能再给a赋值了
 *          a = 111;//错误的
 *
 *          const也可以修饰指针。
 *
 *      4.auto int a; 和 int a是等价的,auto关键字现在基本不用
 *      5.extern 是外部的意思,一般用于函数和全局变量的声明,这个在后面的课程中,会用到。
 *
 *  14.控制语句相关的关键字
 *      if,else,break,continue,for,while,do,switch,case
 *      goto,default
 *
 *      条件控制语句:
 *          if语句: if else
 *          switch语句: switch case default
 *
 *      循环控制语句:
 *          for while do goto
 *
 *      辅助控制语句:
 *          break continue
 *
 *
 *      其他关键字
 *      sizeof,typeof,volatile
 *
 *      1.sizeof
 *          使用来测量变量,数组的占用存储空间的大小(字节数)
 *      2.typedef重命名相关的关键字
 *          作用是给一个已有的类型重新起个类型名,并没有创造一个新的类型。
 *
 *          typedef起别名的方法:
 *          1.用想起名的类型定义一个变量
 *              short int a;
 *          2.用新的类型名替代变量名
 *              short int ITN16;
 *          3.在最前面加typedef
 *              typedef short int INT16;
 *          4.就可以用心的类型名定义变量了
 *              INT16 b和short int b; //是一个效果
 *
 *      3.volatile易改变的意思
 *          用volatile定义的变量,是易改变的意思,即告诉cpu每次用volatile变量的时候,
 *          重新去内存中取保证用的是最新的值,而不是寄存器中的备份。
 *          volatile关键字现在比较适用。
 *
 *
 *
 */
//测试基本数据类型的所占内存大小
int main()
{
    unsigned int usa = 101;
    //    unsigned int a = -101; 错误

    printf("Hello World!\n");

    char a = 'a';
    short int b = 10;
    int c;
    long int d;
    float e;
    double f;
    printf("%d\n", sizeof (a));
    printf("%d\n", sizeof (b));
    printf("%d\n", sizeof (c));
    printf("%d\n", sizeof (d));
    printf("%d\n", sizeof (e));
    printf("%d\n", sizeof (f));

    return 0;
}
